package ld.proxy.dyna;

import ld.proxy.UseDao;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
 * @Author: Liudao
 * @Date: 2022-08-08-16:30
 * @Description:JDK的动态代理
 */
public class UseDaoJDKDynaImpl implements InvocationHandler {
    //生成目标对象
    private UseDao useDao;
    public UseDaoJDKDynaImpl(UseDao useDao){this.useDao = useDao;}
    //生成代理对象
    public UseDao createProxy(){
        /**
         * 参数说明：
         * 1. 当前对象的类加载器对象
         * 2. 目标对象所实现的接口类型的数组
         * 3. 代表实现了InvocationHandler的对象
         */
        return (UseDao) Proxy.newProxyInstance(UseDaoJDKDynaImpl.class.getClassLoader(),
                useDao.getClass().getInterfaces(),this);
    }

    /**
     * 调用不同的目标对象的方法
     * @param proxy 代表代理对象
     * @param method  代表调用的方法
     * @param args  代表方法的参数值
     * @return
     * @throws Throwable
     */
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        //如果方法名是query，先执行安全检查
        if (method.getName().equals("query")){
            check();
        }
        
        //参数1：代表要调用方法的目标对象，参数2：代表参数值
        return method.invoke(useDao,args);
        
    }

    private void check() {
        System.out.println("安全检查。。。");
    }
}
